package ar.edu.utn.frsf.tpae.a2012.g04.presentacion.controller;


import java.io.Serializable;
import java.util.ArrayList;
import java.util.Date;
import java.util.List;
import java.util.Random;
import java.util.ResourceBundle;

import javax.annotation.PostConstruct;
import javax.faces.application.FacesMessage;
import javax.faces.context.ExternalContext;
import javax.faces.context.FacesContext;
import javax.faces.model.SelectItem;
import javax.servlet.http.HttpSession;


import ar.edu.utn.frsf.tpae.a2012.g04.dominio.CajaAhorro;
import ar.edu.utn.frsf.tpae.a2012.g04.dominio.Cliente;
import ar.edu.utn.frsf.tpae.a2012.g04.dominio.Cuenta;
import ar.edu.utn.frsf.tpae.a2012.g04.dominio.CuentaCorriente;

import ar.edu.utn.frsf.tpae.a2012.g04.dominio.Pago;
import ar.edu.utn.frsf.tpae.a2012.g04.presentacion.util.ServiceLocator;

import ar.edu.utn.frsf.tpae.a2012.g04.service.CajaAhorroService;
import ar.edu.utn.frsf.tpae.a2012.g04.service.ClienteService;
import ar.edu.utn.frsf.tpae.a2012.g04.service.CuentaCorrienteService;


public class RealizarPagosBean implements Serializable {

	private static final long serialVersionUID = 1L;

	private Cliente cliente;
	private List<Cuenta> cuentas;
	private long indice;
	private Pago pago;
	private List<SelectItem> cuentasItems;
	private Cuenta cuentaDelPago;

	@PostConstruct
	public void init() {
		cliente = new Cliente();
	}
	
	public String cargarPagina(){
		indice =-1;
		pago = new Pago();
		cuentaDelPago= null;
		FacesContext context = FacesContext.getCurrentInstance();
		ClienteBean bean = (ClienteBean) context.getApplication().evaluateExpressionGet(context, "#{clienteBean}", ClienteBean.class);
		cliente= bean.getCliente();
		ClienteService serviceCliente = ServiceLocator.getClienteService();
		cuentas = serviceCliente.listarCuentas(cliente);
		cuentasItems = new ArrayList<SelectItem>();
		for (Cuenta c : cuentas) {
			cuentasItems.add(new SelectItem(c.getNumero(), c.getSigla() + " - " + c.getNumero()));
		}
		return "realizarPago";
	}

	public String limpiar() {
		return cargarPagina();
	}
	public String aceptar() {
		
		pago.setFecha(new Date());
		Random cod = new Random();
		pago.setCodigo("" + cod.nextInt());
		for (Cuenta c : cuentas) {
			if (c.getNumero() == indice) {
				cuentaDelPago = c;
				
				pago.setCuenta(c);
			
				break;
			}
		}
		mostrar();
		if(validarMovimientoPago()){
			double saldoActual =cuentaDelPago.getSaldo()-pago.getMonto();
			cuentaDelPago.setSaldo(saldoActual);
			System.out.println("Nuevo Saldo "+cuentaDelPago.getSaldo());
			CuentaCorrienteService cuentaService= ServiceLocator.getCuentaCorrienteService();
		    CajaAhorroService cajaAhorroService= ServiceLocator.getCajaAhorroServicio();
		    if(cuentaDelPago instanceof CuentaCorriente){
		    	System.out.println("Se  actualiza el saldo de la CC");
				cuentaService.crear((CuentaCorriente) cuentaDelPago);
			}
			if(cuentaDelPago instanceof CajaAhorro){
				System.out.println("Se  actualiza el saldo de la CA");
				cajaAhorroService.crear((CajaAhorro) cuentaDelPago);
			}
			
		}
		return null;
		
	}
	private boolean validarMovimientoPago() {
		FacesContext context = FacesContext.getCurrentInstance();
		ResourceBundle bundle = ResourceBundle.getBundle("mensajes", context.getViewRoot().getLocale());
		boolean valido = true;
		if (indice == -1) {
			context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, bundle.getString("error.cuentaInvalida"), ""));
			valido = false;
		}
		
		if (pago.getMonto() <= 0) {
			context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, bundle.getString("error.montoInvalido"), ""));
			valido = false;
		}
		
		if (pago.getMonto() > cuentaDelPago.getSaldo()) {
			context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, bundle.getString("error.montoInsuficiente"), ""));
			valido = false;
		}
	
		if (pago.getComentario().isEmpty()) {
			context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, bundle.getString("error.descripcionNula"), ""));
			valido = false;
		}
		
		if (pago.getComentario().length() > 50) {
			context.addMessage(null, new FacesMessage(FacesMessage.SEVERITY_ERROR, bundle.getString("error.descripcionInvalida"), ""));
			valido = false;
		}
		
		return valido;
	}
	
	public String cerrarSession(){
		FacesContext context = FacesContext.getCurrentInstance();

		ExternalContext externalContext = context.getExternalContext();

		Object session = externalContext.getSession(false);

		HttpSession httpSession = (HttpSession) session;

		httpSession.invalidate();
		return "irlogin";
	}
	
	public void mostrar(){
		System.out.println("CLIENTE QUE VA A REALIZAR EL PAGO");
		System.out.println(cliente.getNombre());
		System.out.println(cliente.getApellido());
		System.out.println(cliente.getCuil());
		System.out.println(cliente.getDireccionPostal());
		System.out.println(cliente.getDni());
		System.out.println(cliente.getMail());
		System.out.println(cliente.getNummero());
		System.out.println(cliente.getTelefono());
		for (int i = 0; i < cuentas.size(); i++) {
			System.out.println("	CUENTAS ");
			System.out.println("NUMERO : "+cuentas.get(i).getNumero());
			System.out.println("SALDO : "+cuentas.get(i).getSaldo());
		}
		System.out.println("	CUENTAS SELECCIONADA PARA HACER EL PAGO");
		System.out.println(cuentaDelPago.getSigla()+" -- "+cuentaDelPago.getNumero());
		System.out.println("Numero: "+cuentaDelPago.getNumero());
		System.out.println("Saldo: "+cuentaDelPago.getSaldo());
		System.out.println("Fecha Apertura: "+cuentaDelPago.getFechaApertura());

	}
	
	public List<Cuenta> getCuentas() {
		return cuentas;
	}

	public void setCuentas(List<Cuenta> cuentas) {
		this.cuentas = cuentas;
	}

	public Cliente getCliente() {
		return cliente;
	}

	public void setCliente(Cliente cliente) {
		this.cliente = cliente;
	}

	public long getIndice() {
		return indice;
	}

	public void setIndice(long indice) {
		this.indice = indice;
	}

	public Pago getPago() {
		return pago;
	}

	public void setPago(Pago pago) {
		this.pago = pago;
	}

	public List<SelectItem> getCuentasItems() {
		return cuentasItems;
	}

	public void setCuentasItems(List<SelectItem> cuentasItems) {
		this.cuentasItems = cuentasItems;
	}
	

}
